package com.legendframework.core.dao.wrapper;

import com.legendframework.core.dao.wrapper.Wrapper;
import com.legendframework.core.dao.wrapper.enums.Operator;
import com.legendframework.core.dao.wrapper.interfaces.Compare;
import com.legendframework.core.dao.wrapper.interfaces.Join;
import com.legendframework.core.dao.wrapper.interfaces.Nested;

/**
 * 顶层抽象条件构造器
 *
 * @param <T> 实体类泛型
 * @param <W> 最终的条件集
 * @param <C> 条件字段
 * @param <R> 链式编程返回类型
 */
public abstract class AbstractWrapper<T,W,C,R extends AbstractWrapper<T,W,C,R>>
        implements Wrapper<T>, Compare<C, R> , Nested<R , R> , Join<R> {

    /**
     * 实体类对象
     */
    protected T entity;

    /**
     * 条件合并结果集
     */
    protected W result;

    /**
     * 获取最终的条件集
     *
     * @return 泛型 W
     */
    public W getWrapperResult() {
        return result;
    }

    @Override
    public T getEntity() {
        return entity;
    }

    public void setEntity(T entity) {
        this.entity = entity;
    }

    /**
     * 添加条件
     * @param condition 执行条件
     * @param operator 条件类型
     * @param column 字段
     * @param vals 值
     */
    protected abstract R addCondition(boolean condition,Operator operator , C column, Object... vals);

    /**
     * 子类返回一个自己的新对象
     */
    protected abstract R instance();
}
